<html>
<head>
  <title>Peter's HomePage</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link href="https://cdn.staticfile.net/twitter-bootstrap/5.1.1/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.staticfile.net/twitter-bootstrap/5.1.1/js/bootstrap.bundle.min.js"></script>
  <script src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/2.1.1/jquery.min.js"></script>
  <script src="https://ksylvest.github.io/jquery-growl/javascripts/jquery.growl.js" type="text/javascript"></script>
  <link href="https://ksylvest.github.io/jquery-growl/stylesheets/jquery.growl.css" rel="stylesheet" type="text/css" />
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.0/font/bootstrap-icons.css">
  <style>
    .navbar3 {
              position: fixed;
              left: 60px;
              right: 0;
            }
    .scrollable{
              height: 90%;
              overflow-y: auto;
    }
    .max_200{
    max-width: 200px;
    }

     .flex_right {
      display: flex;
      justify-content: space-between;
      align-items: center;
    }
  </style>
</head>
<body style="background-color: #222;">

<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
		  <symbol id="bootstrap" viewBox="0 0 118 94">
			<title>Bootstrap</title>
			<path fill-rule="evenodd" clip-rule="evenodd" d="M24.509 0c-6.733 0-11.715 5.893-11.492 12.284.214 6.14-.064 14.092-2.066 20.577C8.943 39.365 5.547 43.485 0 44.014v5.972c5.547.529 8.943 4.649 10.951 11.153 2.002 6.485 2.28 14.437 2.066 20.577C12.794 88.106 17.776 94 24.51 94H93.5c6.733 0 11.714-5.893 11.491-12.284-.214-6.14.064-14.092 2.066-20.577 2.009-6.504 5.396-10.624 10.943-11.153v-5.972c-5.547-.529-8.934-4.649-10.943-11.153-2.002-6.484-2.28-14.437-2.066-20.577C105.214 5.894 100.233 0 93.5 0H24.508zM80 57.863C80 66.663 73.436 72 62.543 72H44a2 2 0 01-2-2V24a2 2 0 012-2h18.437c9.083 0 15.044 4.92 15.044 12.474 0 5.302-4.01 10.049-9.119 10.88v.277C75.317 46.394 80 51.21 80 57.863zM60.521 28.34H49.948v14.934h8.905c6.884 0 10.68-2.772 10.68-7.727 0-4.643-3.264-7.207-9.012-7.207zM49.948 49.2v16.458H60.91c7.167 0 10.964-2.876 10.964-8.281 0-5.406-3.903-8.178-11.425-8.178H49.948z"></path>
		  </symbol>
		  <symbol id="home" viewBox="0 0 16 16">
			<path d="M8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4.5a.5.5 0 0 0 .5-.5v-4h2v4a.5.5 0 0 0 .5.5H14a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146zM2.5 14V7.707l5.5-5.5 5.5 5.5V14H10v-4a.5.5 0 0 0-.5-.5h-3a.5.5 0 0 0-.5.5v4H2.5z"/>
		  </symbol>
		  <symbol id="speedometer2" viewBox="0 0 16 16">
			<path d="M8 4a.5.5 0 0 1 .5.5V6a.5.5 0 0 1-1 0V4.5A.5.5 0 0 1 8 4zM3.732 5.732a.5.5 0 0 1 .707 0l.915.914a.5.5 0 1 1-.708.708l-.914-.915a.5.5 0 0 1 0-.707zM2 10a.5.5 0 0 1 .5-.5h1.586a.5.5 0 0 1 0 1H2.5A.5.5 0 0 1 2 10zm9.5 0a.5.5 0 0 1 .5-.5h1.5a.5.5 0 0 1 0 1H12a.5.5 0 0 1-.5-.5zm.754-4.246a.389.389 0 0 0-.527-.02L7.547 9.31a.91.91 0 1 0 1.302 1.258l3.434-4.297a.389.389 0 0 0-.029-.518z"/>
			<path fill-rule="evenodd" d="M0 10a8 8 0 1 1 15.547 2.661c-.442 1.253-1.845 1.602-2.932 1.25C11.309 13.488 9.475 13 8 13c-1.474 0-3.31.488-4.615.911-1.087.352-2.49.003-2.932-1.25A7.988 7.988 0 0 1 0 10zm8-7a7 7 0 0 0-6.603 9.329c.203.575.923.876 1.68.63C4.397 12.533 6.358 12 8 12s3.604.532 4.923.96c.757.245 1.477-.056 1.68-.631A7 7 0 0 0 8 3z"/>
		  </symbol>
		  <symbol id="table" viewBox="0 0 16 16">
			<path d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2zm15 2h-4v3h4V4zm0 4h-4v3h4V8zm0 4h-4v3h3a1 1 0 0 0 1-1v-2zm-5 3v-3H6v3h4zm-5 0v-3H1v2a1 1 0 0 0 1 1h3zm-4-4h4V8H1v3zm0-4h4V4H1v3zm5-3v3h4V4H6zm4 4H6v3h4V8z"/>
		  </symbol>
		  <symbol id="people-circle" viewBox="0 0 16 16">
			<path d="M11 6a3 3 0 1 1-6 0 3 3 0 0 1 6 0z"/>
			<path fill-rule="evenodd" d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm8-7a7 7 0 0 0-5.468 11.37C3.242 11.226 4.805 10 8 10s4.757 1.225 5.468 2.37A7 7 0 0 0 8 1z"/>
		  </symbol>
		  <symbol id="grid" viewBox="0 0 16 16">
			<path d="M1 2.5A1.5 1.5 0 0 1 2.5 1h3A1.5 1.5 0 0 1 7 2.5v3A1.5 1.5 0 0 1 5.5 7h-3A1.5 1.5 0 0 1 1 5.5v-3zM2.5 2a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3zm6.5.5A1.5 1.5 0 0 1 10.5 1h3A1.5 1.5 0 0 1 15 2.5v3A1.5 1.5 0 0 1 13.5 7h-3A1.5 1.5 0 0 1 9 5.5v-3zm1.5-.5a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3zM1 10.5A1.5 1.5 0 0 1 2.5 9h3A1.5 1.5 0 0 1 7 10.5v3A1.5 1.5 0 0 1 5.5 15h-3A1.5 1.5 0 0 1 1 13.5v-3zm1.5-.5a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3zm6.5.5A1.5 1.5 0 0 1 10.5 9h3a1.5 1.5 0 0 1 1.5 1.5v3a1.5 1.5 0 0 1-1.5 1.5h-3A1.5 1.5 0 0 1 9 13.5v-3zm1.5-.5a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3z"/>
		  </symbol>
</svg>

  <div class="container" style="background-color: #fff;">
    <header class="d-flex flex-wrap align-items-center justify-content-center justify-content-md-between py-3 mb-4 border-bottom">
      <div class="bd-navbar-toggle">
      <button class="navbar-toggler p-2 d-lg-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#bdSidebar" aria-controls="bdSidebar" aria-label="Toggle docs navigation">
        <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" class="bi" fill="currentColor" viewBox="0 0 16 16">
        <path fill-rule="evenodd" d="M2.5 11.5A.5.5 0 0 1 3 11h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4A.5.5 0 0 1 3 3h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z"></path>
      </svg>
        <span class="d-none fs-6 pe-1">Browse</span>
      </button>
    </div>

      <a href="#" class="d-flex align-items-center col-md-3 mb-2 mb-md-0 text-dark text-decoration-none" aria-controls="offcanvasResponsive">
        <svg class="bi me-2" width="40" height="32" role="img" aria-label="Bootstrap"><use xlink:href="#bootstrap"/></svg>
       <span class="fs-4">Peter's Home</span>
      </a>

<button class="btn btn-primary d-lg-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasResponsive" aria-controls="offcanvasResponsive">Toggle offcanvas</button>

      <ul class="nav col-12 col-md-auto mb-2 justify-content-center mb-md-0">
        <li><a href="/admin/" class="nav-link px-2 link-dark" target="_blank">Home</a></li>
        <li><a href="/admin/media_center/rssfeeditembbc/" class="nav-link px-2 link-dark" target="_blank">RssFeed</a></li>
        <li><a href="/sentence/bs5/audios" class="nav-link px-2 link-secondary">Audios</a></li>
        <li><a href="/sentence/bs5/Topics" class="nav-link px-2 link-dark">Topics</a></li>
        <li><a href="#" class="nav-link px-2 link-dark">About</a></li>
      </ul>

      <div class="col-md-3 text-end">
        <button type="button" class="d-none btn btn-outline-primary me-2">Login</button>
        <button type="button" class="d-none btn btn-primary">Sign-up</button>
      </div>
    </header>
  </div>

<div class="container">
  <aside style="grid-area: sidebar;">

  </aside>
  <main class="bd-main order-1">
    <div class="row">
      <div class="col-sm-3">
              <form>
                <div class="input-group">
                  <span class="input-group-text">
                    <i class="bi bi-search"></i> <!-- 这里使用 Bootstrap Icons 的搜索图标，你可以根据需求更换图标 -->
                  </span>
                  <input id="search" type="search" class="form-control" placeholder="Search..." aria-label="Search">
                </div>
              </form>
              <div class="scrollable" style="height:800px;">
                <ul class="list-group">
                  {% for each in phrase_dict_list %}
                  <li class="list-group-item list-group-item-action" data-idx="{{forloop.counter }}" data-total="{{ phrases|length }}">
                    <i class="bi bi-sticky-fill"></i>
                    <span class="phrase">{{each.content}}</span>
                    <span class="position-absolute top-2 badge rounded-pill {% if each.count > 0 %} bg-success {% else %} bg-danger {% endif %}">
                      {{each.count}}</span></li>
                  {% endfor %}
                </ul>
              </div>
              <div class="offcanvas offcanvas-start" tabindex="-1" id="bdSidebar" aria-labelledby="bdSidebarLabel">
                <div class="offcanvas-header">
                  <h5 class="offcanvas-title" id="bdSidebarLabel">PhraseList</h5>
                  <button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
                </div>
                <div class="offcanvas-body">

                </div>
              </div>

      </div>
      <div class="col-sm-9 bg-white rounded">
        <div class="progress">
          <div id="progress_bar" class="progress-bar bg-success progress-bar-striped" style="width:40%"></div>
        </div>
        <div class="flex_right"><h3 >Examples <span id="phrase"></span> </h3><span id="gpt" class="btn badge rounded-pill bg-danger">GPT</span></div>
        <p id="dict_container">...</p>
      </div>
    </div>
  </main>
</div>

<script >
  function add_to_gpt(phrase){
        fetch('/sentence/gpt_examples_add/3', {
            method: 'POST',
            body: phrase, // 将数据转换为 JSON 字符串作为请求体
        } )
       .then(response => {
            if (!response.ok) {
                throw new Error(`HTTP error! status: ${response.status}`);
            }
          return response.text(); // 如果响应是 JSON 格式，可以这样获取响应数据
        }
       )
      .then(data => {
              console.log(data);
              $.growl.notice({
                  title: "OK",
                message: JSON.stringify(data)
              });
         })
     .catch(error => {
      console.error('Error:', error);
     })
  }

  function get_gpt_examples(phrase){
    $("#dict_container").html('<div><div class="spinner-border text-muted"></div>正在生成例句...</div>');
    fetch('/sentence/gpt_examples/3', {
            method: 'POST',
            body: phrase, // 将数据转换为 JSON 字符串作为请求体
        } )
       .then(response => {
          if (!response.ok) {
              throw new Error(`HTTP error! status: ${response.status}`);
          }
          return response.text(); // 如果响应是 JSON 格式，可以这样获取响应数据
      })
      .then(data => {
          new_content = '<p>GPT 生成的例句：<button id="add_to_gpt" type="button" class="btn btn-secondary"><i class="bi bi-cloud-plus"></i> add</button></p> ';
          new_content = new_content + data;
          $("#dict_container").html(new_content);
          $("#add_to_gpt").click(function() {
              $("#add_to_gpt").prop('disabled', false)
              console.log("add to gpt");
              add_to_gpt(phrase);
          })
      })
  };

     $(document).ready(function() {
      $('#gpt').click(function() {
        console.log("gpt");
        get_gpt_examples($("ul li.active").text());
      }
      );

      $("#search").keypress(function(event) {
         text = $("#search").val();
         console.log(text);
         $("ul li").each(function(){
             if (text === "" || $(this).text().indexOf(text) !== -1) {
                $(this).show();
              }
             else {
                $(this).hide();
              }
        });
       }
        );

      $('ul li').click(function() {
        phrase = $(this).children("span.phrase").text();
        console.log(phrase);
        phrase_with_link = '<a href="/admin/sentences/phrase/?q='+phrase+'" target="_blank">' + phrase + '</a>'
        $("#phrase").html(phrase_with_link);
        $("ul li").removeClass("active");
        $(this).toggleClass('active');
        width = ($(this).data('idx') / $(this).data('total') * 100).toFixed(1) + "%";
        $("#progress_bar").css("width", width);
        $("#progress_bar").text(width);

        fetch('/sentence/app/one/?is_json=1&q='+phrase)
           .then(response => response.json())
           .then(data => {
             console.log(data);
             word = data.content;
             full_content = "";
             audio = data.audio;
             if (audio.length > 0){
             full_content = full_content + '<audio controls><source src="' + audio + '" type="audio/mpeg"></audio>';
             }
             sentence_num = data['sentences'].length
             for (let i = 0; i < sentence_num; i++) {
                 sentence = data['sentences'][i].en;
                 cn = data['sentences'][i].cn;
                 sentence = sentence.replaceAll(word, '<mark class="bg-danger text-white">' + word + '</mark>');
                 console.log(sentence);
                 full_content = full_content + '<p>' + sentence + '</p>';
                 full_content = full_content + '<p><small class="text-muted">' + cn + '</small></p>';
             }
             $("#dict_container").html(full_content);
             if (sentence_num == 0){
              get_gpt_examples(word);
             }
           })
           .catch(error => {
            console.error('Error:', error);
           })
      });
    });
  </script>
<!--
xxxx
xxx
xxx
xxxx
xxxx
xxx


-->

</body>
</html>


















